Chào mừng bạn đến với Sự chuyển giao vĩ đại. Trong lập trình CPU, chúng ta xác định làm thế nào để lặp lại; còn trong GPGPU, chúng ta xác định điều gì một lần lặp có hình dạng như thế nào. Sự chuyển dịch từ logic tập trung vào lệnh sang logic tập trung vào dữ liệu được thúc đẩy bởi Sự trừu tượng kernel.
1. Bản thiết kế __global__
Bằng cách sử dụng __global__ thuộc tính, bạn không đang viết một hàm—bạn đang thiết kế một bản thiết kế mở rộng. Một lần thực thi kernel đại diện cho một đơn vị công việc độc lập, cho phép GPU tổ chức hàng nghìn tác vụ giống nhau trên số lượng lõi khổng lồ mà không cần quản lý luồng thủ công.
2. Bộ giải quyết địa chỉ toàn cục
Làm thế nào để một luồng duy nhất trong hàng triệu luồng tìm được mục tiêu của nó? Nó sử dụng một thỏa thuận xác định gọi là công thức lập chỉ số:
$$\text{threadID} = \text{blockIdx.x} \times \text{blockDim.x} + \text{threadIdx.x}$$
Công thức này hoạt động như một hệ tọa độ, nối kết dữ liệu logic của phần mềm (mảng) với cấu trúc vật lý của phần cứng (khối và luồng).
3. Cấu hình thực thi
Các tham số <<<B, T>>> xác định hình dạng lưới. Điều này đảm bảo Tính mở rộng minh bạch: mã nguồn của bạn chạy logic giống hệt nhau dù phần cứng có 2 SM hay 80 SM.